package com.health.trans.pojo;

import cn.hutool.core.util.ArrayUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.health.trans.kit.ReaderConfig;
import com.health.trans.util.DataSourceUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.util.Date;
import java.util.function.BiConsumer;

/**
 * @author nqlz
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class ReaderJson extends SyncProperty {

    @ApiModelProperty("是否 全为写入")
    private boolean usePersist = false;

    /**
     * 医疗机构代码
     */
    @ApiModelProperty("医疗机构代码")
    private String hospCode;

    /**
     * 数据开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("数据开始时间")
    private Date startTime;

    /**
     * 数据结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("数据结束时间")
    private Date endTime;

    @Min(value = 10, message = "size最小为10")
    @ApiModelProperty("分页大小")
    private int pageSize = 10;

    /**
     * 写入大小,Es批处理大小最大为10000
     */
    @Max(value = 10000, message = "size最大为10000")
    @ApiModelProperty("单次处理大小")
    private int chunkSize = 10000;

    @ApiModelProperty("总处理数量")
    private int maxCount;


    /**
     * 如果总数量大于0,则总数应大于分页数量
     *
     * @return boolean
     */
    public boolean validTotalCount() {
        return maxCount <= 0 || maxCount >= pageSize;
    }

    public <T> ReaderConfig<T> getReaderConfig() {
        return new ReaderConfig<T>()
                .setPageSize(pageSize)
                .setDataSource(DataSourceUtil.getDataSource(super.getSource()))
                .setMaxCount(maxCount)
                .setSourceName(super.getSource());
    }
    public void getDatePredicate(BiConsumer<Date, Date> dateConsumer) {
        if (dateTimeAllNotNull()) {
            dateConsumer.accept(startTime, endTime);
        }
    }

    public boolean dateTimeAllNotNull() {
        return ArrayUtil.isAllNotNull(startTime, endTime);
    }

}
